package service

import (
	"fmt"
	"goconfcenter/core/enums"
	"goconfcenter/dao/mysql"
	"goconfcenter/dao/redis"
	"goconfcenter/models"
	"goconfcenter/service/dto/bus"

	"github.com/goccy/go-json"
)

type BackendUserService struct {
}

func BackendUserServiceInstance() *BackendUserService {
	return &BackendUserService{}
}

func (c *BackendUserService) GetByUserName(p *bus.LoginDTO) *models.BackendUser {
	user := mysql.BackendUserDaoInstance().GetByUserName(p.UserName)
	return user
}

//Get 获取登录用户基本信息
func (c *BackendUserService) GetInfo(userId int64) *bus.BackendLoginUserDTO {
	var backendLoginUserDTO *bus.BackendLoginUserDTO
	cacheKey := fmt.Sprintf("%s%d", redis.GetRedisKey(redis.LoginBackendUser), userId)
	value, err := redis.Get(cacheKey)
	if err != nil {
		return nil
	}
	json.Unmarshal([]byte(value), &backendLoginUserDTO)
	if backendLoginUserDTO == nil || backendLoginUserDTO.ID == 0 {
		user := mysql.BackendUserDaoInstance().Get(userId)
		if user != nil {
			backendLoginUserDTO.ID = user.ID
			backendLoginUserDTO.UserName = user.UserName
			backendLoginUserDTO.RealName = user.RealName
			backendLoginUserDTO.AuthType = user.AuthType
			if user.AuthType == enums.SuperAdmin.Value() {
				backendLoginUserDTO.IsSuper = true
			} else {
				backendLoginUserDTO.IsSuper = false
			}
			backendLoginUserDTO.Access = []string{}
			//获取用户的权限码列表
			userJson, _ := json.Marshal(backendLoginUserDTO)
			redis.Set(cacheKey, userJson, redis.EXPIRED_DAY)
			return backendLoginUserDTO
		} else {
			return nil
		}
	} else {
		return backendLoginUserDTO
	}
}

func (c *BackendUserService) PageByQuery(params *bus.BackendUserQuery) ([]*models.BackendUserPoJo, int64) {
	result, total := mysql.BackendUserDaoInstance().PageByQuery(params)
	return result, total
}

func (c *BackendUserService) ClearBackendLoginUserInfo(userId int64) {
	cacheKey := fmt.Sprintf(redis.GetRedisKey(redis.LoginBackendUser), userId)
	redis.Del(cacheKey)
	return
}
func (c *BackendUserService) AccountExists(params *bus.BackendUserQuery) bool {
	result := mysql.BackendUserDaoInstance().GetListByQuery(params)
	if len(result) > 0 {
		return true
	} else {
		return false
	}
}
func (c *BackendUserService) Insert(user *models.BackendUser) *models.BackendUser {
	return mysql.BackendUserDaoInstance().Insert(user)
}
func (c *BackendUserService) Update(user *models.BackendUser) bool {
	return mysql.BackendUserDaoInstance().Update(user)
}

func (c *BackendUserService) Get(userId int64) *models.BackendUser {
	return mysql.BackendUserDaoInstance().Get(userId)
}
func (c *BackendUserService) BathDelete(ids *[]int64, operatorId int64) bool {
	return mysql.BackendUserDaoInstance().BathDelete(ids, operatorId)
}
